// #include "EventLoop.h"
#pragma once
#include <cstdint>
#include <iostream>
#include <functional>
#include <sys/epoll.h>



// channel模块用来管理有关文件描述符的各种操作，包括获取，添加，关闭监控事件，真正的设置关心由Poller模块设置，即Poller模块管理Channel模块
// 以及事件触发后的各种回调函数
namespace muduo{
    class EventLoop;
    class Channel{
    private:
        int _fd;
        using EventsCallback =std::function<void()>;    
        EventLoop* _loop;                               // 被管理的文件描述符
        uint32_t _events;                               // 需要监控的事件 
        uint32_t _revents;                              // 当前连接触发的事件
        EventsCallback _read_callback;                  // 可读事件回调
        EventsCallback _writ_callback;                  // 可写事件回调
        EventsCallback _error_callback;                 // 错误事件回调
        EventsCallback _close_callback;                 // 关闭事件回调
        EventsCallback _event_callback;                 // 任意事件回调
    public:
        Channel(EventLoop* loop=nullptr,int fd=-1);
        int Fd();
        void SetEvents(uint32_t events);        // 设置就绪监控事件
        uint32_t events();       // 获取正在被监控的事件
        void DisableAll();       // 关闭所有监控事件
        bool ReadAble();         // 是否监控了可读
        bool WriterAble();       // 是否监控了可写
        void EnableRead();       // 添加读事件监控
        void EnableWrite();      // 添加写事件监控
        void CloseRead();        // 关闭读事件监控
        void CloseWrite();       // 关闭写事件监控
        void Update();           // 更新事件监控(只要更改了需要监控的事件，则使用Poller更新，为了更新epoll模型中的事件状态)
        void Remove();           // 从Poller中移除被管理的channel，注意和DisableAll区分，一个一不监控了，一个是不玩了
        void Set_read_callback(const EventsCallback& cb);  //设置读事件触发回调函数
        void Set_write_callback(const EventsCallback& cb);  //设置写事件触发回调函数
        void Set_error_callback(const EventsCallback& cb); //设置错误事件触发回调函数
        void Set_close_callback(const EventsCallback& cb); //设置关闭事件触发回调函数
        void Set_event_callback(const EventsCallback& cb); //设置任意事件触发回调函数
        void HanderEvents();
    };
}